/**
 * 这是专门写权限的文件，比如写导航守卫那些
 */
 import router from './router'
 import store from './store'
 // 导入NProgress
 import nprogress from 'nprogress'
 // 导入他的样式
 import 'nprogress/nprogress.css'
 
 // 导入全部的动态路由
 import { aysncRoutes } from '@/router'
 
 
 /**
  * to：  去哪
  * from: 从哪来
  * next：放行的函数，调用就代表放行，不调用就是不放行
  * 
  * 路由白名单：
  *  设置一些页面不需要做token的判断，例如登录需要判断有没有token吗？
  *  上一个项目通过路由元信息来判断的
  *  白名单本质上就是一个数组，数组里有不需要token就能访问的页面的路径
  * 
  */
 
 //  设置路由白名单
 let whiteList = ['/login', '/404']
 router.beforeEach(async (to, from, next) => {
 
   // 准备跳转时要出进度条
   nprogress.start()
 
   // 判断是否有token
   if (store.getters.token) {
     // 登录了
     // 还要判断是不是去的登录页
     if (to.path === '/login') {
       // 放行到首页
       next('/')
     } else {
 
       // 如果没有数据才发请求
       if (!store.getters.userId) {
         // 在这里获取用户信息
         let userInfo = await store.dispatch('user/getUserInfo')
 
         // 我们就应该在这里根据menus来分配路由
         // console.log(userInfo.roles.menus)
         // 把它对应拥有的路由对象加到路由规则里
         // 这里的item就是每个路由对象，路由对象里有name属性
         // 那么根据name属性，判断在不在menus里面，在就提取出来
         let routes = await store.dispatch('permission/getAsyncRoutes', userInfo.roles.menus)
         
         // 把筛选出来的路由对象，加到路由规则里
         // 给路由对象添加路由规则（添加的一堆规则，既然是一堆规则就是一个数组
         // 添加好那些路由就代表给你铺了一些到那些页面的路
         // 铺路需要一丢丢时间，所以如果addRoutes后立即next，放行不过去
         router.addRoutes(routes)
         // 解决办法就是这次先不去，下次一定
         next(to.path) // 跟next()区别在于，next()这次就要去，next(to.path)相当于先回来下次再去
       }
       // 既登录了而且去的也不是登录页，就正常放行
       // 就证明这里就是去后台的任何一个页面，不管去哪个页面都需要有用户信息
       next()
     }
   } else {
 
     // 判断要去的路由在不在白名单里面
     if (whiteList.includes(to.path)) {
 
       next()
 
     } else {
 
       // 没有登录，打回登录页
       next('/login')
     }
   }
 })
 
 
 // 路由跳转之后
 router.afterEach((to, from) => {
 
   // 停止进度条
   nprogress.done()
 })